/**
 * 绘制三维圆柱区域，并对圆心进行标注和添加圆点
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Number} lon - 圆心的经度。
 * @param {Number} lat - 圆心的纬度。
 * @param {Number} minHeight - 圆柱的底部高度。
 * @param {Number} maxHeight - 圆柱的顶部高度。
 * @param {Number} radius - 圆柱的半径。
 * @param {String} color - 圆柱的颜色。
 * @param {Number} alpha - 圆柱的透明度。
 * @returns {Object} - 返回绘制的实体。
 */
export function drawCylinderAreaM1(viewer, lon, lat, minHeight, maxHeight, radius, color, alpha = 0.5) {
  const height = maxHeight - minHeight; // 计算圆柱的高度

  const entity = viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(lon, lat, minHeight + height / 2), // 圆柱体中心位置
    cylinder: {
      length: height,
      topRadius: radius,
      bottomRadius: radius,
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha)
    }
  });

  // 对圆柱中心点进行标注和添加圆点
  viewer.entities.add({
    position: Cesium.Cartesian3.fromDegrees(lon, lat, minHeight + height / 2), // 圆心点位置
    point: {
      pixelSize: 10, // 圆点的大小
      color: Cesium.Color.RED, // 圆点的颜色
      outlineWidth: 2, // 圆点的轮廓线宽
      outlineColor: Cesium.Color.WHITE // 圆点的轮廓颜色
    },
    label: {
      text: '圆心',
      font: '10pt sans-serif',
      fillColor: Cesium.Color.YELLOW,
      style: Cesium.LabelStyle.FILL_AND_OUTLINE,
      outlineWidth: 2,
      outlineColor: Cesium.Color.BLACK,
      verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
      heightReference: Cesium.HeightReference.NONE
    }
  });

  return entity; // 返回绘制的实体
}


/**
 * 绘制三维轨迹长方体管道（模拟飞行路径，长宽高可变），并添加球体衔接和点标注
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 包含每个点的经纬度和高度 [lon1, lat1, alt1, lon2, lat2, alt2, ...]。
 * @param {Array} sizes - 每段的长宽高数组 [[width1, height1], [width2, height2], ...]。
 * @param {String} color - 管道的颜色。
 * @param {Array} pointNames - 每个点的名称，用于标注。
 * @returns {Array} - 返回所有绘制的实体数组。
 */
export function draw3DRectangularPipelineTrackM1(viewer, positions, sizes, color = 'YELLOW', pointNames = []) {
  const cartesianPositions = [];
  for (let i = 0; i < positions.length; i += 3) {
    const position = Cesium.Cartesian3.fromDegrees(positions[i], positions[i + 1], positions[i + 2]);
    cartesianPositions.push(position);
  }

  // 确保 sizes 数组的长度与 cartesianPositions 一致
  if (cartesianPositions.length - 1 !== sizes.length) {
    console.error('Positions length does not match sizes length');
    return null;
  }

  const entities = [];

  // 循环每段轨迹并为每段生成不同的长方体横截面
  for (let i = 0; i < cartesianPositions.length - 1; i++) {
    const start = cartesianPositions[i];
    const end = cartesianPositions[i + 1];
    const width = sizes[i][0]; // 每段的宽度
    const height = sizes[i][1]; // 每段的高度

    // 添加实体，绘制不同宽高的长方体管道
    const entity = viewer.entities.add({
      polylineVolume: {
        positions: [start, end], // 每段的起点和终点
        shape: computeRectangleM1(width, height), // 自定义横截面形状（长方形）
        material: Cesium.Color[color.toUpperCase()].withAlpha(0.8), // 管道颜色
        outline: true, // 是否显示轮廓
        outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
        outlineWidth: 1 // 轮廓线宽
      }
    });

    // 添加到实体数组
    entities.push(entity);

    // 对当前点进行标注
    if (pointNames[i]) {
      viewer.entities.add({
        position: start,
        label: {
          text: pointNames[i],
          font: '10pt sans-serif',
          fillColor: Cesium.Color.WHITE,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          outlineWidth: 2,
          outlineColor: Cesium.Color.BLACK,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签底部与点对齐
          heightReference: Cesium.HeightReference.NONE, // 高度不受地形影响
          scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5), // 根据视角缩放大小
          disableDepthTestDistance: Number.POSITIVE_INFINITY, // 确保标注不被其他对象遮挡
        }
      });
    }

    // 添加球体衔接下一个管道
    if (i < cartesianPositions.length - 2) {
      const nextSize = sizes[i + 1];
      const radius = calculateSphereRadius(width, height, nextSize[0], nextSize[1]);
      const nextStart = cartesianPositions[i + 1];
      addConnectionSphere(viewer, nextStart, radius, color);
    }
  }

  // 标注最后一个点
  const endPointName = pointNames[cartesianPositions.length - 1];
  if (endPointName) {
    viewer.entities.add({
      position: cartesianPositions[cartesianPositions.length - 1],
      label: {
        text: endPointName,
        font: '10pt sans-serif',
        fillColor: Cesium.Color.WHITE,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outlineWidth: 2,
        outlineColor: Cesium.Color.BLACK,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        heightReference: Cesium.HeightReference.NONE,
        scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5), // 根据视角缩放大小
        disableDepthTestDistance: Number.POSITIVE_INFINITY, // 确保标注不被其他对象遮挡
      }
    });
  }

  // 返回所有实体
  return entities;
}

/**
 * 生成长方体的截面形状
 * @param {Number} width - 横截面的宽度。
 * @param {Number} height - 横截面的高度。
 * @returns {Array} - 组成长方形的 Cartesian2 坐标点数组。
 */
function computeRectangleM1(width, height) {
  return [
    new Cesium.Cartesian2(-width / 2, -height / 2), // 左下角
    new Cesium.Cartesian2(width / 2, -height / 2), // 右下角
    new Cesium.Cartesian2(width / 2, height / 2), // 右上角
    new Cesium.Cartesian2(-width / 2, height / 2), // 左上角
  ];
}

/**
 * 根据前后管道段的宽度和高度计算球体的半径
 * @param {Number} width1 - 当前段管道的宽度。
 * @param {Number} height1 - 当前段管道的高度。
 * @param {Number} width2 - 下一个段管道的宽度。
 * @param {Number} height2 - 下一个段管道的高度。
 * @returns {Number} - 球体的半径。
 */
function calculateSphereRadius(width1, height1, width2, height2) {
  // 使用前后两段管道宽高的平均值作为球体的半径
  return Math.max((width1 + width2) / 2, (height1 + height2) / 2) / 2;
}

/**
 * 添加球体连接来平滑连接两段管道
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Object} position - 球体的位置。
 * @param {Number} radius - 球体的半径。
 * @param {String} color - 球体的颜色。
 */
function addConnectionSphere(viewer, position, radius, color) {
  viewer.entities.add({
    position: position,
    ellipsoid: {
      radii: new Cesium.Cartesian3(radius, radius, radius),
      material: Cesium.Color[color.toUpperCase()].withAlpha(0.8)
    }
  });
}

/**
 * 绘制三维轨迹长方体走廊（模拟飞行路径，宽度可变），并添加点标注
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 包含每个点的经纬度和高度 [lon1, lat1, alt1, lon2, lat2, alt2, ...]。
 * @param {Array} sizes - 每段的长宽高数组 [[width1, height1], [width2, height2], ...]。
 * @param {String} color - 管道的颜色。
 * @param {Array} pointNames - 每个点的名称，用于标注。
 * @param {String} cornerType - 管道拐角处的类型（默认使用圆角）。
 * @returns {Array} - 返回所有绘制的实体数组。
 */
export function draw3DRectangularPipelineTrackM1_2(viewer, positions, sizes, color = 'YELLOW', pointNames = [], cornerType = Cesium.CornerType.ROUNDED) {
  const cartesianPositions = [];
  for (let i = 0; i < positions.length; i += 3) {
    const position = Cesium.Cartesian3.fromDegrees(positions[i], positions[i + 1], positions[i + 2]);
    cartesianPositions.push(position);
  }

  const entities = [];

  // 循环处理每一段位置和对应的宽高
  for (let i = 0; i < cartesianPositions.length - 1; i++) {
    const segmentPositions = [cartesianPositions[i], cartesianPositions[i + 1]];
    const width = sizes[i][0]; // 每段的宽度
    const height = sizes[i][1]; // 每段的高度

    // 使用 CorridorGeometry 绘制走廊
    const corridorEntity = viewer.entities.add({
      corridor: {
        positions: segmentPositions, // 定义走廊中心的点
        width: width, // 走廊的宽度
        height: 0, // 走廊的高度（从地表到走廊的高度）
        extrudedHeight: height, // 拉伸高度，形成立体走廊
        material: Cesium.Color[color.toUpperCase()].withAlpha(0.8), // 走廊颜色
        cornerType: cornerType // 圆角衔接
      }
    });

    entities.push(corridorEntity);

    // 对当前点进行标注
    if (pointNames[i]) {
      viewer.entities.add({
        position: cartesianPositions[i],
        label: {
          text: pointNames[i],
          font: '10pt sans-serif',
          fillColor: Cesium.Color.WHITE,
          style: Cesium.LabelStyle.FILL_AND_OUTLINE,
          outlineWidth: 2,
          outlineColor: Cesium.Color.BLACK,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签底部与点对齐
          heightReference: Cesium.HeightReference.NONE, // 高度不受地形影响
          scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5), // 根据视角缩放大小
          disableDepthTestDistance: Number.POSITIVE_INFINITY, // 确保标注不被其他对象遮挡
        }
      });
    }
  }

  // 标注最后一个点
  const endPointName = pointNames[cartesianPositions.length - 1];
  if (endPointName) {
    viewer.entities.add({
      position: cartesianPositions[cartesianPositions.length - 1],
      label: {
        text: endPointName,
        font: '10pt sans-serif',
        fillColor: Cesium.Color.WHITE,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outlineWidth: 2,
        outlineColor: Cesium.Color.BLACK,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        heightReference: Cesium.HeightReference.NONE,
        scaleByDistance: new Cesium.NearFarScalar(1.5e2, 1.5, 1.0e7, 0.5), // 根据视角缩放大小
        disableDepthTestDistance: Number.POSITIVE_INFINITY, // 确保标注不被其他对象遮挡
      }
    });
  }

  // 返回所有实体
  return entities;
}




/**
 * 绘制三维多边形柱状体，并对每个顶点进行标注
 * @param {Object} viewer - Cesium Viewer 对象，用于在场景中添加实体。
 * @param {Array} positions - 包含每个顶点的经纬度 [lon1, lat1, lon2, lat2, ...]。
 * @param {Number} minHeight - 柱状体的底部高度。
 * @param {Number} maxHeight - 柱状体的顶部高度。
 * @param {String} color - 柱状体的颜色。
 * @param {Number} alpha - 柱状体的透明度（默认值为 0.5）。
 * @param {Array} pointNames - 每个顶点的名称，用于标注。
 * @returns {Object} - 返回绘制的实体。
 */
export function draw3DPolygonalPrismM1(viewer, positions, minHeight, maxHeight, color = 'BLUE', alpha = 0.5, pointNames = []) {
  const cartesianPositions = [];
  for (let i = 0; i < positions.length; i += 2) {
    const position = Cesium.Cartesian3.fromDegrees(positions[i], positions[i + 1], minHeight);
    cartesianPositions.push(position);
  }

  const height = maxHeight - minHeight;

  // 添加实体，绘制多边形柱状体
  const entity = viewer.entities.add({
    polygon: {
      hierarchy: {
        positions: cartesianPositions
      },
      extrudedHeight: maxHeight,
      height: minHeight,
      material: Cesium.Color[color.toUpperCase()].withAlpha(alpha), // 柱状体颜色
      outline: true, // 是否显示轮廓
      outlineColor: Cesium.Color[color.toUpperCase()], // 轮廓颜色
      outlineWidth: 1 // 轮廓线宽
    }
  });

  // 对每个顶点进行标注和添加小圆点
  for (let i = 0; i < cartesianPositions.length; i++) {
    // 添加小圆点
    viewer.entities.add({
      position: Cesium.Cartesian3.fromDegrees(positions[i * 2], positions[i * 2 + 1], maxHeight + 10), // 高度比 maxHeight 高10米，确保标注显眼
      point: {
        pixelSize: 10, // 小圆点的大小
        color: Cesium.Color.RED, // 小圆点的颜色
        outlineWidth: 2, // 小圆点的轮廓线宽
        outlineColor: Cesium.Color.WHITE // 小圆点的轮廓颜色
      }
    });

    // 添加标签
    viewer.entities.add({
      position: Cesium.Cartesian3.fromDegrees(positions[i * 2], positions[i * 2 + 1], maxHeight + 20), // 高度比 maxHeight 高20米，确保标签显眼
      label: {
        text: pointNames[i] || `点${i + 1}`, // 使用提供的名称或默认名称
        font: '10pt sans-serif',
        fillColor: Cesium.Color.WHITE,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        outlineWidth: 2,
        outlineColor: Cesium.Color.BLACK,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 标签底部与点对齐
        heightReference: Cesium.HeightReference.NONE // 高度不受地形影响
      }
    });
  }

  return entity; // 返回绘制的实体
}
